package com.zouxw.utils.json.utils;

import javax.swing.JOptionPane;
import java.awt.Component;
import java.io.IOException;
import java.nio.file.AccessDeniedException;
import java.nio.file.NoSuchFileException;

/**
 * 异常处理器
 * 统一处理应用程序中的各种异常，提供用户友好的错误提示
 * 
 * @author zouxw
 * @version 1.0
 */
public class ExceptionHandler {
    
    // ==================== 错误消息常量 ====================
    private static final String ERROR_TITLE = "错误";
    private static final String WARNING_TITLE = "警告";
    private static final String INFO_TITLE = "信息";
    
    // ==================== 私有构造函数 ====================
    /**
     * 私有构造函数，防止实例化
     */
    private ExceptionHandler() {
        throw new UnsupportedOperationException("异常处理器不能被实例化");
    }
    
    // ==================== 公共异常处理方法 ====================
    
    /**
     * 处理JSON解析异常
     * 
     * @param parent 父组件
     * @param e JSON解析异常
     */
    public static void handleJsonParseError(Component parent, JsonParseException e) {
        String message = e.getUserFriendlyMessage();
        showErrorDialog(parent, ERROR_TITLE, message);
    }
    
    /**
     * 处理通用异常
     * 
     * @param parent 父组件
     * @param e 异常
     */
    public static void handleGenericError(Component parent, Exception e) {
        String message = getUserFriendlyMessage(e);
        showErrorDialog(parent, ERROR_TITLE, message);
    }
    
    /**
     * 处理文件操作异常
     * 
     * @param parent 父组件
     * @param e 文件异常
     */
    public static void handleFileError(Component parent, IOException e) {
        String message = getFileErrorMessage(e);
        showErrorDialog(parent, ERROR_TITLE, message);
    }
    
    /**
     * 处理数字格式异常
     * 
     * @param parent 父组件
     * @param e 数字格式异常
     * @param input 用户输入
     */
    public static void handleNumberFormatError(Component parent, NumberFormatException e, String input) {
        String message = AppConfig.DIALOG_INVALID_NUMBER + input;
        showErrorDialog(parent, ERROR_TITLE, message);
    }
    
    /**
     * 显示警告对话框
     * 
     * @param parent 父组件
     * @param title 标题
     * @param message 消息
     */
    public static void showWarning(Component parent, String title, String message) {
        JOptionPane.showMessageDialog(parent, message, title, JOptionPane.WARNING_MESSAGE);
    }
    
    /**
     * 显示信息对话框
     * 
     * @param parent 父组件
     * @param title 标题
     * @param message 消息
     */
    public static void showInfo(Component parent, String title, String message) {
        JOptionPane.showMessageDialog(parent, message, title, JOptionPane.INFORMATION_MESSAGE);
    }
    
    /**
     * 显示错误对话框
     * 
     * @param parent 父组件
     * @param title 标题
     * @param message 消息
     */
    public static void showError(Component parent, String title, String message) {
        showErrorDialog(parent, title, message);
    }
    
    // ==================== 私有辅助方法 ====================
    
    /**
     * 显示错误对话框
     * 
     * @param parent 父组件
     * @param title 标题
     * @param message 消息
     */
    private static void showErrorDialog(Component parent, String title, String message) {
        JOptionPane.showMessageDialog(parent, message, title, JOptionPane.ERROR_MESSAGE);
    }
    
    /**
     * 获取用户友好的错误消息
     * 
     * @param e 异常
     * @return 用户友好的错误消息
     */
    private static String getUserFriendlyMessage(Exception e) {
        if (e instanceof JsonParseException) {
            return ((JsonParseException) e).getUserFriendlyMessage();
        }
        
        if (e instanceof IOException) {
            return getFileErrorMessage((IOException) e);
        }
        
        if (e instanceof NumberFormatException) {
            return "数字格式错误：" + e.getMessage();
        }
        
        if (e instanceof IllegalArgumentException) {
            return "参数错误：" + e.getMessage();
        }
        
        if (e instanceof NullPointerException) {
            return "空指针错误：请检查数据是否完整";
        }
        
        // 默认错误消息
        String message = e.getMessage();
        if (message == null || message.trim().isEmpty()) {
            message = e.getClass().getSimpleName();
        }
        
        return "处理错误：" + message;
    }
    
    /**
     * 获取文件错误消息
     * 
     * @param e 文件异常
     * @return 文件错误消息
     */
    private static String getFileErrorMessage(IOException e) {
        if (e instanceof NoSuchFileException) {
            return "文件不存在：" + e.getMessage();
        }
        
        if (e instanceof AccessDeniedException) {
            return "访问被拒绝：没有权限访问该文件";
        }
        
        if (e.getMessage() != null && e.getMessage().contains("Permission denied")) {
            return "权限不足：无法访问该文件";
        }
        
        if (e.getMessage() != null && e.getMessage().contains("No space left")) {
            return "磁盘空间不足：无法保存文件";
        }
        
        if (e.getMessage() != null && e.getMessage().contains("File too large")) {
            return "文件过大：无法处理该文件";
        }
        
        // 默认文件错误消息
        String message = e.getMessage();
        if (message == null || message.trim().isEmpty()) {
            message = "文件操作失败";
        }
        
        return "文件错误：" + message;
    }
    
    /**
     * 记录异常到日志（未来可以扩展为真正的日志记录）
     * 
     * @param e 异常
     * @param context 上下文信息
     */
    public static void logException(Exception e, String context) {
        // 这里可以集成日志框架，如Log4j、SLF4J等
        System.err.println("异常上下文：" + context);
        System.err.println("异常类型：" + e.getClass().getSimpleName());
        System.err.println("异常消息：" + e.getMessage());
        e.printStackTrace();
    }
    
    /**
     * 检查异常是否为严重错误
     * 
     * @param e 异常
     * @return 是否为严重错误
     */
    public static boolean isCriticalError(Throwable e) {
        return e instanceof OutOfMemoryError ||
               e instanceof StackOverflowError ||
               e instanceof VirtualMachineError;
    }
    
    /**
     * 获取异常严重程度
     * 
     * @param e 异常
     * @return 严重程度（1-5，5为最严重）
     */
    public static int getErrorSeverity(Throwable e) {
        if (e instanceof OutOfMemoryError || e instanceof StackOverflowError) {
            return 5; // 最严重
        }
        
        if (e instanceof VirtualMachineError) {
            return 4; // 很严重
        }
        
        if (e instanceof JsonParseException) {
            JsonParseException jpe = (JsonParseException) e;
            if (jpe.getErrorType() == JsonParseException.ErrorType.STRUCTURE_ERROR) {
                return 3; // 严重
            }
            return 2; // 中等
        }
        
        if (e instanceof IOException) {
            return 2; // 中等
        }
        
        return 1; // 轻微
    }
}